package com.boot.adminservice.map.service.strategy;

import com.boot.adminapi.map.constants.MapConstants;
import com.boot.adminservice.map.domain.dto.SysRegionDTO;
import com.boot.adminservice.map.domain.entity.SysRegion;
import com.boot.adminservice.map.mapper.RegionMapper;
import com.boot.commoncore.utils.BeanCopyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * 获取城市列表具体策略:从数据库查询策略
 */
@Component("fromDBStrategy")
public class FromDBStrategy implements GetCityListStrategy{

    /**
     * sys_region的mapper
     */
    @Autowired
    private RegionMapper regionMapper;

    /**
     * 城市列表查询 V1 数据库查询方案
     * @return 城市列表信息
     */
    @Override
    public List<SysRegionDTO> getCityList() {
        // 1 声明一个空列表
        List<SysRegionDTO> result = new ArrayList<>();
        // 2 查询数据库
        List<SysRegion> list =  regionMapper.selectAllRegion();
        // 3 提取城市数据列表,并且做对象转换
        for (SysRegion sysRegion : list) {
            if (sysRegion.getLevel().equals(MapConstants.CITY_LEVEL)) {
                SysRegionDTO sysRegionDTO = new SysRegionDTO();
                BeanCopyUtil.copyProperties(sysRegion, sysRegionDTO);
                result.add(sysRegionDTO);
            }
        }
        return result;
    }

    /**
     * 按首字母A-Z分类的城市列表查询 V1 数据库查询方案
     * @return 按首字母分类的城市列表信息
     */
    @Override
    public Map<String, List<SysRegionDTO>> getCityPyList(){
        // 1 直接先查数据库
        List<SysRegion> list = regionMapper.selectAllRegion();
        // 2 按首字母分类
        Map<String, List<SysRegionDTO>> map = new TreeMap<>();
        for (SysRegion sysRegion : list) {
            if (sysRegion.getLevel().equals(MapConstants.CITY_LEVEL)) {
                SysRegionDTO sysRegionDTO = new SysRegionDTO();
                BeanCopyUtil.copyProperties(sysRegion, sysRegionDTO);
                // 3 首字母大写拿出来
                String firstChar = sysRegionDTO.getPinyin().toUpperCase().substring(0 ,1);
                // 4 首字母出现过
                if (map.containsKey(firstChar)) {
                    map.get(firstChar).add(sysRegionDTO);
                } else {
                    List<SysRegionDTO> regionDTOList = new ArrayList<>();
                    regionDTOList.add(sysRegionDTO);
                    map.put(firstChar, regionDTOList);
                }
            }
        }
        return map;
    }
}
